#ifndef _SL_SEARCH_INDEX_H_
#define _SL_SEARCH_INDEX_H_

#include <map>
#include <string>

#include <boost/thread/thread.hpp>
#include <boost/algorithm/string.hpp>

#include "base/logging.h"

using namespace std;
using namespace boost;

// class boost::shared_mutex;

class SearchIndex {
public:
  static SearchIndex & Instance() {
    static SearchIndex instance; 
    return instance;
  }

  // 输入查询串，返回指定的若干条结果，总条数，以及查询串分词结果
  // 输入: 
  //   text, 查询串
  //   start, 起始位置
  //   count, 返回的最大文章数
  // 输出:
  //   seg_words, text切分后的词列表
  //   total_count, 搜索结果中总的文章数
  // 返回值:
  //   文章id列表, 按优先级排序
  vector<int> Search(const string & text, int start, size_t count, vector<string> * seg_words, int32_t * total_count);
  vector<int> SearchByTime(const string & text, int start, size_t count, vector<string> * seg_words, int32_t * total_count);

  bool Reload(const char * index_dir);
  void Dump();

private:
  // 分词，并获取各个单词的权重
  // 输入: 
  //   text, 查询串
  // 返回值:
  //   分词后的各个单词, 及其的权重
  friend void TestSingleTokenSearch();
  map<double, string> GetWeightedTokens(const string & text);

  bool LoadIndexFile(const char * index_file);

  typedef map<string, multimap<double, int> > IndexCache;
  IndexCache index_cache_;
  SearchIndex() {}

  boost::shared_mutex shared_mutex_;

  bool AddScoreIds(const string & score_text, multimap<double, int > * score_map);
  SearchIndex(const SearchIndex&); 
};

#endif // _SL_SEARCH_INDEX_H_

